#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
//自己设计一个用户缓冲区
//
#define NUM 1024
typedef struct MyFILE_
{
    int _fd;
    char buffer[NUM];//缓冲区
    int end;
}MyFILE;

MyFILE* fopen_(const char* pashname, const char* mode)
{
    assert(pashname);
    assert(mode);
    MyFILE* fp = NULL;

    if(strcmp(mode,"w") == 0)
    {
        int fd = open(pashname, O_WRONLY | O_TRUNC | O_CREAT, 0666);
        if(fd >= 0)
        {
            fp = (MyFILE*)malloc(sizeof(MyFILE));//开结构体空间
            memset(fp, 0, sizeof(MyFILE));//初始化
            fp->_fd = fd;
        }
    }
    else if(strcmp(mode, "w+") == 0)
    {}
    else if(strcmp(mode, "r") == 0)
    {}
    else if(strcmp(mode, "r+") == 0)
    {}
    else if(strcmp(mode, "a") == 0)
    {}
    else if(strcmp(mode, "a+") == 0)
    {}
    else {

        //什么也不做
    }

    return fp;
}
void fputs_(const char* message, MyFILE* fd)
{
    assert(message && fd);

    //拷贝数据
    strcpy(fd->buffer + fd->end, message);//会自动添加\0
    //更新end
    fd->end += strlen(message);//始终让fd->buffer + fd->end指向\0位置  

    //debug打印看看
    printf("%s\n",fd->buffer);
    //暂时没刷新
    //刷新策略
    if(fd->_fd == 0)
    {
    
    }
    else if(fd->_fd == 1)
    {
        //标准输出//
        if(fd->buffer[fd->end - 1] == '\n')
        {
           // fprintf(stderr,"fflush:%s",fd->buffer);
            write(fd->_fd, fd->buffer, fd->end);
            fd->end = 0;
        }
    }
    else if(fd->_fd == 2){}
    else {
        //其他文件
    }
}
void fflush_(MyFILE* fd)
{
    assert(fd);

    if(fd->end != 0)
    {
        write(fd->_fd, fd->buffer, fd->end);
        syncfs(fd->_fd);
        fd->end = 0;
    }
}
void fclose_(MyFILE* fd)
{
    assert(fd);
    fflush_(fd);
    close(fd->_fd);
    free(fd);
}
int main()
{
    //close(1);
    MyFILE* fd = fopen_("log.txt", "w");
    if(fd == NULL)
    {
        printf("open file error\n");
        return 1;
    }
    fputs_("one:hello bit", fd);
    //sleep(1);
    //fputs_("two:hello bit", fd);
    //sleep(1);
    //fputs_("three:hello bit\n", fd);
    //sleep(1);
    //fputs_("four:hello bit\n", fd);
    //sleep(1) ;
    
    fork();
    fclose_(fd);

    return 0;
}




































//int main()
//{
//
//    printf("hello printf\n");
//    fprintf(stdout,"hello fprintf\n");
//    const char* s = "hello fputs\n";
//    fputs(s, stdout);
//
//    const char* ss = "hello write\n";
//    write(1, ss, strlen(ss));
//    
//    //fflush(stdout);
//
//    fork();
//
//
//
//
////    if(argc != 2)
////    {
////        return 2;
////    }
////
////    //int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
////    int fd = open("log.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
////    if(fd < 0)
////    {
////        perror("open");
////        return 1;
////    }
////    dup2(fd,1);
////    fprintf(stdout,"%s\n", argv[1]);
//
//
//
//
//
//
//    //close(1);
//    //int fd = open("log.txt", O_WRONLY | O_APPEND | O_CREAT);
//    //if(fd < 0)
//    //{
//    //    perror("open");
//    //    return 1;
//    //}
//    //fprintf(stdout,"you can see me\n");
//    
//
//    //printf("fd:%d\n",fd);
//
//    //char buffer[64] = {0};
//    //fgets(buffer, sizeof buffer, stdin);
//
//    //printf("%s\n",buffer);
//
//
//
//
//
//
//
//
//
//
//
//
//
//    //close(1);
//    //int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//    //if(fd < 0)
//    //{
//    //    perror("open");
//    //    return 1;
//    //}
//    //printf("fd:%d\n",fd);
//    //printf("fd:%d\n",fd);
//    //printf("fd:%d\n",fd);
//    //printf("fd:%d\n",fd);
//    //printf("fd:%d\n",fd);
//    //printf("fd:%d\n",fd);
//    //fprintf(stdout,"hello bit\n");
//    //const char* s = "hello writen\n";
//    //fwrite(s,strlen(s), 1, stdout);
//
////    fflush(stdout);
//   // close(fd);
////  //  close(fd);
//    return 0;
//}
